unit TPS_Tambah;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, ZAbstractTable, ZDataset, DB, ZAbstractRODataset,
  ZAbstractDataset, ZConnection, Setting, ExtCtrls;

type
  TPemilih = record
     ID:String;
     NIK:String;
     NKK:String;
     NAMA:String;
     TEMPAT:String;
     TANGGAL:String;
     IBU:String;
     AGAMA:String;
     KAWIN:String;
     KELAMIN:String;
     KELAINAN:String;
     ALAMAT:String;
     KOTA:String;
     KEC:String;
     DESA:String;
     RW:String;
     RT:String;
     KET:String;
  end;
  TTPemilih = array of TPemilih;
  Ttambahtps = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ZConnection1: TZConnection;
    ZQuery1: TZQuery;
    ZTable1: TZTable;
    ZTable2: TZTable;
    ZQuery2: TZQuery;
    lblNamaTPS: TLabel;
    alamat_tps: TEdit;
    Panel1: TPanel;
    btn_tambah_orang: TButton;
    btnnext: TButton;
    Btnprev: TButton;
    Button3: TButton;
    Label3: TLabel;
    lblhal: TLabel;
    lblPemilih: TLabel;
    rtcombo: TComboBox;
    rwcombo: TComboBox;
    StringGrid1: TStringGrid;
    txtHal: TEdit;
    Label1: TLabel;
    Panel2: TPanel;
    btn_hapus_orang: TButton;
    btn_hapus_semua: TButton;
    btnNext2: TButton;
    btnPrev2: TButton;
    Label2: TLabel;
    lblHal2: TLabel;
    lblTPS: TLabel;
    StringGrid2: TStringGrid;
    txtHal2: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    lblKet: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure fetchdb();
    procedure FormCreate(Sender: TObject);
    procedure TampilHalaman(Hal:Integer = 1);
    procedure btnnextClick(Sender: TObject);
    procedure BtnprevClick(Sender: TObject);
    procedure rwcomboChange(Sender: TObject);
    procedure rtcomboChange(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure btnPrev2Click(Sender: TObject);
    procedure btnNext2Click(Sender: TObject);
    procedure btn_hapus_semuaClick(Sender: TObject);
    procedure btn_hapus_orangClick(Sender: TObject);
    procedure StringGrid2Click(Sender: TObject);
    procedure btn_tambah_orangClick(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
  private
    procedure TampilHalaman2(Hal2: Integer = 1);
    function cekPemilihTPS(pemilih: TPemilih): Boolean;
    function cekBufTPS(pemilih: TPemilih): Boolean;
    function cekJmlTPS(tambah: Integer): Boolean;
    procedure AutoSizeCol(Grid: TStringGrid; Column: integer);
    function cekNamaTPS(kata: String): String;
    { Private declarations }
  public
    { Public declarations }
    sKabkot:string;
    skec:string;
    sdesa:string;
    srw:string;
    srt:string;
    crow:integer;
    drow:integer;
    cHal:Integer; //current halaman
    jHal:Integer; //jumlah halaman
    bHal:Integer; //batas per halaman
    crow2:integer;
    drow2:integer;
    cHal2:Integer; //current halaman
    jHal2:Integer; //jumlah halaman
    bHal2:Integer; //batas per halaman
    bPemilih:TTPemilih; //grid 1
    bTPS:TTPemilih; //grid 2
    fData:Boolean;
    daftID:String;
    selectedrow1,selectedrow2:integer;
    constructor Create(AOwner: TComponent; sd: String);             overload;

  end;

var
  tambahtps: Ttambahtps;

implementation

{$R *.dfm}


procedure Ttambahtps.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure Ttambahtps.FormCreate(Sender: TObject);
var
  setting:TSetting_Form;
  urut:Integer;
  ntps,ikabkot,ikec,idesa:String;
begin
  setting:=TSetting_Form.Create;
  ZConnection1.HostName:=setting.host;
  ZConnection1.Protocol:=setting.protocol;
  ZConnection1.Database:=setting.database;
  ZConnection1.User:=setting.user;
  ZConnection1.Password := setting.password;
  ZConnection1.LoginPrompt := False;
  ZConnection1.Connected := True;
  ZQuery1.Connection:=ZConnection1;
  ZQuery2.Connection:=ZConnection1;
  ZTable1.Connection:=ZConnection1;
  ZTable2.Connection:=ZConnection1;

  //sdesa:='79010005';
  with zquery1 do begin
    active:=false;
    sql.Clear;
    sql.Text:='SELECT * FROM desa WHERE KODE_DESA='+QuotedStr(sdesa);
    active:=true;
    first;
    idesa:=FieldByName('TAMPIL').AsString;
    ikec:=FieldByName('KODE_KECAMATAN').AsString;
    ikabkot:=FieldByName('KODE_KABKOT').AsString;
    //
    active:=false;
    sql.Clear;
    sql.Text:='SELECT * FROM kecamatan WHERE KODE_KECAMATAN='+QuotedStr(ikec);
    active:=true;
    first;
    ikec:=FieldByName('TAMPIL').AsString;
    //
    active:=false;
    sql.Clear;
    sql.Text:='SELECT * FROM kabkot WHERE KODE='+QuotedStr(ikabkot);
    active:=true;
    first;
    ikabkot:=FieldByName('TAMPIL').AsString;
    //
    lblKet.Caption:=ikabkot+', Kec. '+ikec+', Desa./Kel. '+idesa;
  end;
  ZQuery2.Active := False;
  ZQuery2.SQL.Text:='SELECT DISTINCT(RW) FROM pemilih_'+sdesa;
  ZQuery2.Active := True;
  ZQuery2.First;  //tabel simpan
  while (not ZQuery2.Eof) do
  begin
    rwcombo.Items.Add(ZQuery2.FieldByName('RW').AsString);
    ZQuery2.Next;
  end;

  ZTable1.Active := False;
  ZTable1.TableName := 'kabkot';
  ZTable1.Active := True;
  ZTable1.First;
  sKabkot:='';
  sKec:='';
  cRow:=2;  //wadah row
  crow2:=2;
  dRow:=1;  //menyimpan banyaknya data
  drow2:=1;
  lblHal.Caption:= '-';
  lblHal2.Caption:= '-';
  txtHal.Enabled:=False;
  txtHal2.Enabled:=False;
  btnPrev.Enabled:=False;
  btnPrev2.Enabled:=False;
  btnNext.Enabled:=False;
  btnNext2.Enabled:=False;
  //grid 1
  StringGrid1.Cells[0,0]:='NO';
  StringGrid1.Cells[1,0]:='NIK';
  StringGrid1.Cells[2,0]:='NKK';
  StringGrid1.Cells[3,0]:='Nama';
  StringGrid1.Cells[4,0]:='Tempat Lahir';
  StringGrid1.Cells[5,0]:='Tanggal Lahir';
  StringGrid1.Cells[6,0]:='Nama Ibu';
  StringGrid1.Cells[7,0]:='Agama';
  StringGrid1.Cells[8,0]:='Perkawinan';
  StringGrid1.Cells[9,0]:='Jenis Kelamin';
  StringGrid1.Cells[10,0]:='Kelainan';
  StringGrid1.Cells[11,0]:='Alamat';
  StringGrid1.Cells[12,0]:='Kota';
  StringGrid1.Cells[13,0]:='Kecamatan';
  StringGrid1.Cells[14,0]:='Desa';
  StringGrid1.Cells[15,0]:='RW';
  StringGrid1.Cells[16,0]:='RT';
  StringGrid1.Cells[17,0]:='Ket';
  StringGrid1.RowCount:=cRow;
  //grid 2
  StringGrid2.Cells[0,0]:='NO';
  StringGrid2.Cells[1,0]:='NIK';
  StringGrid2.Cells[2,0]:='NKK';
  StringGrid2.Cells[3,0]:='Nama';
  StringGrid2.Cells[4,0]:='Tempat Lahir';
  StringGrid2.Cells[5,0]:='Tanggal Lahir';
  StringGrid2.Cells[6,0]:='Nama Ibu';
  StringGrid2.Cells[7,0]:='Agama';
  StringGrid2.Cells[8,0]:='Perkawinan';
  StringGrid2.Cells[9,0]:='Jenis Kelamin';
  StringGrid2.Cells[10,0]:='Kelainan';
  StringGrid2.Cells[11,0]:='Alamat';
  StringGrid2.Cells[12,0]:='Kota';
  StringGrid2.Cells[13,0]:='Kecamatan';
  StringGrid2.Cells[14,0]:='Desa';
  StringGrid2.Cells[15,0]:='RW';
  StringGrid2.Cells[16,0]:='RT';
  StringGrid2.Cells[17,0]:='Ket';
  StringGrid2.RowCount:=cRow2;
  SetLength(bTPS,1);
  //cek TPS
  with ZQuery1 do begin
    active:=false;
    sql.Clear;
    sql.Text:='SELECT * FROM daftar_tps WHERE KODE_DESA='+QuotedStr(sdesa)+' ORDER BY NAMA DESC';
    Active:=true;
    first;
    if (FieldByName('NAMA').AsString='') then
      urut:=0
    else
      urut:=StrToInt(FieldByName('NAMA').AsString);
    inc(urut);
    ntps:=IntToStr(urut);
    lblNamaTPS.Caption:=cekNamaTPS(ntps);
  end;
end;

Function Ttambahtps.cekNamaTPS(kata:String) : String;
var
  stemp:String;
begin
  sTemp:='';
  if (Length(kata)=1) then
    sTemp:='00'+kata
  else if (Length(kata)=2) then
    sTemp:='0'+kata
  else if (Length(kata)>3) then
    sTemp:=Copy(kata, Length(kata)-3, 3)
  else
    sTemp:=kata;
  Result := sTemp;
end;

procedure Ttambahtps.rtcomboChange(Sender: TObject);
begin
if (rtcombo.ItemIndex > -1) then
  begin
    srt := rtcombo.Items[rtcombo.ItemIndex];
    {ZQuery2.Active := False;
    ZQuery2.SQL.Text:='SELECT * FROM pemilih_'+sdesa+' where RW='+QuotedStr(srw)+' and RT='+QuotedStr(srt;
    ZQuery2.Active := True;
    ZQuery2.First;  //tabel simpan}
    fetchdb;
  end
    else
  begin
    srt:='';
  end;
end;

procedure Ttambahtps.rwcomboChange(Sender: TObject);
var
  i:Integer;
begin
if (rwcombo.ItemIndex > -1) then
  begin
    srw := rwcombo.Items[rwcombo.ItemIndex];

    rtcombo.Clear;
    rtcombo.Items.Add('PILIH RT');
    rtcombo.ItemIndex:=0;

    ZQuery2.Active := False;
    ZQuery2.SQL.Text:='SELECT DISTINCT(RT) FROM pemilih_'+sdesa+' where RW="'+srw+'"';
    ZQuery2.Active := True;
    ZQuery2.First;  //tabel simpan
    while (not ZQuery2.Eof) do
    begin
      rtcombo.Items.Add(ZQuery2.FieldByName('RT').AsString);
      ZQuery2.Next;
    end;
    for i := 1 to StringGrid1.RowCount - 1
    do StringGrid1.Rows[i].Clear;
  end
    else
  begin
    srw:='';
    srt:='';
  end;
end;

procedure Ttambahtps.StringGrid1Click(Sender: TObject);
begin
  if ((StringGrid1.Row>0)and(stringgrid1.Cells[0,1]<>'')and(cHal>0)) then begin
      selectedrow1:= stringgrid1.Row + ((cHal-1)*bHal);
//      ShowMessage(IntToStr(selectedrow1));
  end;
end;

procedure Ttambahtps.StringGrid2Click(Sender: TObject);
begin
  if ((StringGrid2.Row>0)and(stringgrid2.Cells[0,1]<>'') and(cHal2>0)) then begin
      selectedrow2:=stringgrid2.Row + ((cHal2-1)*bHal2);
  end;

end;

procedure Ttambahtps.btnNext2Click(Sender: TObject);
begin
  TampilHalaman2(cHal2+1);
  txtHal2.Text:=IntToStr(cHal2);
end;

procedure Ttambahtps.btnnextClick(Sender: TObject);
begin
  TampilHalaman(cHal+1);
  txtHal.Text:=IntToStr(cHal);
end;

procedure Ttambahtps.btnPrev2Click(Sender: TObject);
begin
  TampilHalaman2(cHal2-1);
  txtHal2.Text:=IntToStr(cHal2);
end;

procedure Ttambahtps.BtnprevClick(Sender: TObject);
begin
  TampilHalaman(cHal-1);
  txtHal.Text:=IntToStr(cHal);
end;

procedure Ttambahtps.btn_hapus_orangClick(Sender: TObject);
var
  I: Integer;
begin
  if(selectedrow2<>0)and(drow2>0) then
  begin
//    Showmessage(inttostr(selectedrow2));
    drow2:=drow2-1;
    //Showmessage(bTPS[selectedrow2].NAMA);
    for I := selectedrow2 to Length(btps)-2 do
    begin
//    Showmessage(inttostr(i));
      bTPS[I]:=btps[I+1]
    end;
    SetLength(btps, length(btps)-1);
    TampilHalaman2();
    if (drow2=1) then begin
      StringGrid2.RowCount:=2;
      for I := 0 to 17 do
        StringGrid2.Cells[i,1]:='';
      end;
    if(selectedrow2>1)then
      selectedrow2:=selectedrow2-1;
    if (drow2>0) then
      lblTPS.Caption:=IntToStr(drow2-1);
  end;
end;

procedure Ttambahtps.btn_hapus_semuaClick(Sender: TObject);
var i:integer;
begin
  SetLength(btps, 0);
  drow2:=0;
  StringGrid2.RowCount:=2;
  for I := 0 to 17 do
    StringGrid2.Cells[i,1]:='';
  lblTPS.Caption:='-';


end;

procedure Ttambahtps.btn_tambah_orangClick(Sender: TObject);
var
  vrow,i:integer;
  temp:TPemilih;
  ada:Boolean;
begin
//  ShowMessage(IntToStr(selectedrow1)+' '+IntToStr(StringGrid1.Row));
  if((selectedrow1<>0) and(StringGrid1.RowCount>=2) and (StringGrid1.Cells[0,1]<>'')) then
  begin
    vrow:=drow2;
    ada:=false;
    //cek bung lebih ndak
    if (vrow<600) then begin
      temp:=bPemilih[selectedrow1];
      if (cekBufTPS(bPemilih[selectedrow1])) then begin
        SetLength(bTPS,(Length(bTPS)+1));
        bTPS[vrow]:=temp;
        ada:=true;
        Inc(vrow);
      end;
      drow2:=Length(btps);
      if (drow2>=2) then begin
        lblTPS.Caption:=IntToStr(drow2-1);
        TampilHalaman2();
        lblTPS.Caption:=IntToStr(drow2-1);
      end;
      if ada=true then
        ShowMessage('Berhasil menambahkan data ')
      else
        ShowMessage('Pemilih sebelumnya telah ditambahkan');
    end
  end;
end;

procedure Ttambahtps.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure Ttambahtps.Button2Click(Sender: TObject);
var
  I:Integer;
  sInto,kodep:String;
  sLine:String;
  ktabel,kacuan,kid,bid:String;
begin
  if (alamat_tps.Text<>'Alamat TPS ....') then begin
      ZTable1.Active := False;
      ZTable1.TableName := 'daftar_tps';
      ZTable1.Filter := 'NAMA = '+QuotedStr(AnsiUpperCase(lblNamaTPS.Caption))+' AND KODE_DESA='+QuotedStr(sdesa);
      ZTable1.Filtered := True;
      ZTable1.Active := True;
      ZTable1.First;
      ShowMessage('Harap menanti proses sesaat');
      if (ZTable1.Fields[1].AsString <> '') then
      begin
        ShowMessage('Cek nama TPS, TPS ini telah ada tersimpan');
      end else if (StringGrid2.Cells[1,1]='') then
        ShowMessage('Isi dahulu pre TPS baru')
      else
        begin
          with ZQuery1 do  //masukkin nih tps gan
            begin
              Active:=False;
              sql.Clear;
              sql.Text := 'INSERT INTO daftar_tps (NAMA, KODE_DESA, ALAMAT) VALUES ("'+AnsiUpperCase(lblNamaTPS.Caption)+'","'+sdesa+'","'+AnsiUpperCase(alamat_tps.Text)+'")';
              ExecSQL;

              Active:=False;
              sql.Clear;
              sql.Text := 'SELECT * FROM daftar_tps WHERE NAMA='+QuotedStr(AnsiUpperCase(lblNamaTPS.Caption))+' AND KODE_DESA='+QuotedStr(sdesa);
              Active:=True;
              First;
            end;
          daftID:=ZQuery1.FieldByName('ID_TPS').AsString;
          //simpan per data di data_tps
          for I := 1 to High(bTPS) do
          begin
            kodep:=Copy(bTPS[I].ID,17,(Length(bTPS[I].ID)-16));
            with ZQuery1 do
            begin
              Active:=False;
              SQL.Clear;
              SQL.Text:='UPDATE pemilih_'+sdesa+' SET TPS='+daftID+' WHERE ID_USER='+QuotedStr(kodep);
              ExecSQL;
            end;
          end;
          for i := 1 to StringGrid2.RowCount - 1
          do StringGrid2.Rows[i].Clear;
          SetLength(bTPS,1);
          StringGrid2.RowCount:=1;
          drow2:=1;
          lblHal2.Caption:=IntToStr(drow2-1);
          lblTPS.Caption:=IntToStr(drow2-1);
          ShowMessage('TPS : '+QuotedStr(AnsiUpperCase(lblNamaTPS.Caption))+' sudah disimpan');
//          fetchdb;
          //reset
          alamat_tps.Text:='';
          lblPemilih.Caption:= '-';
          rwcombo.ItemIndex:=-1;
          rtcombo.ItemIndex:=-1;
          SetLength(bPemilih,1);
          StringGrid1.RowCount:=1;
          lblNamaTPS.Caption:=cekNamaTPS(IntToStr(StrToInt(lblNamaTPS.Caption)+1));
      end;
  end
    else
  ShowMessage('Isi dahulu alamat TPS dengan benar');
end;

procedure Ttambahtps.Button3Click(Sender: TObject);
var
  I:Integer;
  vrow:Integer;
  temp:TPemilih;
  ada:Boolean;
begin
  //tambah RT/RW
  //cek RT/RW ini sudah ada di TPS lain gak???
  if((sdesa<>'') and(srw<>'') and(srt<>'') and (StringGrid1.Cells[1,1]<>''))then
  begin
    ZTable1.Active := False;
    ZTable1.TableName := 'daftar_tps';
    ZTable1.Filter := 'NAMA = '+QuotedStr(AnsiUpperCase(lblNamaTPS.Caption))+' AND KODE_DESA='+QuotedStr(sdesa);
    ZTable1.Filtered := True;
    ZTable1.Active := True;
    ZTable1.First;
    if (ZTable1.Fields[1].AsString <> '') then
    begin
      ShowMessage('Cek nama TPS, TPS ini telah ada tersimpan');
    end
      else
    begin
      //PINDAHIN dari grid 1 ke grid2
      //showmessage(inttostr(drow2));
      SetLength(bTPS, drow2);
      vrow:=drow2;
      ada:=false;
      //cek bung lebih ndak
      if (vrow<601) then begin
        for I := 1 to Length(bPemilih) - 1 do
        begin
          temp:=bPemilih[I];
          if (cekBufTPS(bPemilih[I])) then begin
            SetLength(bTPS,(Length(bTPS)+1));
            bTPS[vrow]:=temp;
            ada:=true;
            Inc(vrow);
          end;
          if (vrow>600) then break;
        end;
        drow2:=Length(btps);
        if (drow2>2) then begin
          lblTPS.Caption:=IntToStr(drow2-1);
          TampilHalaman2();
          if (ada=true) then
            ShowMessage('Berhasil menambahkan data ')
          else
            ShowMessage('RT dan RW ini sudah ditambahkan sebelumnya')
        end;
      end
        else
      ShowMessage('Jumlah sudah melebihi batas TPS');
    end;
  end
    else
    ShowMessage('Pilih lokasi terlebih dahulu dan memiliki pemilih')
end;

function Ttambahtps.cekJmlTPS(tambah:Integer):Boolean;
var
  idtps:String;
  res:Boolean;
begin
  res:=True;
  with ZTable1 do
  begin
    Active:=False;
    TableName:='daftar_tps';
    Filter:='KODE_DESA='+QuotedStr(sdesa)+' AND NAMA='+QuotedStr(lblNamaTPS.Caption);
    Filtered:=True;
    Active:=True;
    First;
  end;
  if (ZTable1.FieldByName('ID_TPS').AsString<>'') then begin
    idtps:=ZTable1.FieldByName('ID_TPS').AsString;
    with ZQuery1 do
    begin
      Active:=False;
      sql.Clear;
      SQL.Text:='SELECT count(*) FROM pemilih_'+sdesa+'WHERE TPS='+idtps;
      Active:=True;
      First;
      if (Fields[0].AsInteger+tambah)>600 then
        res:=False;
    end;
  end;
  Result:=res;
end;

procedure Ttambahtps.AutoSizeCol(Grid: TStringGrid; Column: integer);
var
  i, W, WMax: integer;
begin
  WMax := 0;
  for i := 0 to (Grid.RowCount - 1) do begin
    W := Grid.Canvas.TextWidth(Grid.Cells[Column, i]);
    if W > WMax then
      WMax := W;
  end;
  Grid.ColWidths[Column] := WMax + 5;
end;

function Ttambahtps.cekPemilihTPS(pemilih:TPemilih):Boolean;
var
  idsimpan,iduser,idtps:String;
  tabel,kodpem:String;
  res:Boolean;
begin
  //true kalau kosong, false kalau ada
  res:=True;
  tabel:=Copy(pemilih.ID,1,16);
  iduser:=Copy(pemilih.ID,17,(Length(pemilih.ID)-16));
  kodpem:=iduser;
  ShowMessage(tabel+' '+kodpem);
  with ZTable1 do
  begin
    Active:=False;
    TableName:='daftar_tps';
    Filter:='KODE_DESA='+QuotedStr(Copy(tabel,9,8));
    Filtered:=True;
    Active:=True;
    First;
  end;
  if (ZTable1.FieldByName('ID_TPS').AsString<>'') then begin
    while (not ZTable1.Eof) do begin
      idtps:=ZTable1.FieldByName('ID_TPS').AsString;
      ShowMessage(idtps);
      with ZTable2 do
      begin
        Active:=False;
        //TableName:='pemilih_'+Copy(tabel,9,8);
        TableName:=tabel;
        Filter:='ID_USER='+QuotedStr(kodpem)+' AND TPS='+idtps;
        Filtered:=True;
        Active:=True;
        First;
        if (FieldByName('ID_USER').AsString<>'') then begin
          res:=False;
          break;
        end;
      end;
    ZTable1.Next
    end;
  end;
  ShowMessage('cek pem='+BoolToStr(res));
  Result:=res;
end;

constructor Ttambahtps.Create(AOwner: TComponent; sd: String);
begin
  sdesa:=sd;
  inherited Create(AOwner);
//  ShowMessage(sdesa);
end;

function Ttambahtps.cekBufTPS(pemilih:TPemilih):Boolean;
var
  Ok : boolean;
  I : Integer;
begin
  Ok:=True;
  for I := 1 to High(bTPS) do
  begin
    if (bTPS[I].ID=pemilih.ID) then begin
      Ok:=False;
      break;
    end;
  end;
  Result:=Ok;
end ;

procedure Ttambahtps.FetchDB();
var
  kode:String;
  query,que:String;
  kKota:String;
  kKec:String;
  kDesa:String;
  tblName:String;
  i:Integer;
  vRow:Integer;
begin
  dRow:=1;
  vRow:=1;
  fData:=False;
  jHal:=0;
  StringGrid1.RowCount:=2;
  lblHal.Caption:='-';
  //reset
  for i := 1 to StringGrid1.RowCount - 1
  do StringGrid1.Rows[i].Clear;
  //ganti
  if (sDesa<>'') then
    begin
      kode:=sDesa;
      kKota:='';//kabkotCombo.Items[kabkotCombo.ItemIndex];
      kKec:='';//kecCombo.Items[kecCombo.ItemIndex];
      kDesa:='';//keldesCombo.Items[keldesCombo.ItemIndex];
    end;
  query:='NAMA LIKE "pemilih_'+kode+'%"';
  ZQuery1.Active := False;
  query:= 'SELECT * FROM penyimpan WHERE '+query;
  ZQuery1.SQL.Text := query;
  ZQuery1.Active := True;
  ZQuery1.First;  //tabel simpan
  //ganti
    ZTable1.Active := False;
    tblName:=ZQuery1.FieldByName('NAMA').AsString;
    ZTable1.TableName := tblName;
    que:='RW='+QuotedStr(srw)+' AND RT='+QuotedStr( srt )+' AND TPS=0';  //get query
    ZTable1.Filter:=que;
    ZTable1.Filtered := TRUE;
    ZTable1.Active := True;
    ZTable1.First;  //tabel
    dRow:=dRow+ZTable1.RecordCount;
//    ShowMessage(IntToStr(drow));
    SetLength(bPemilih,dRow);
    lblPemilih.Caption:=IntToStr(drow-1);
    fData:=True;
    while (not ZTable1.Eof) do
      begin
        bPemilih[vRow].ID :=tblName+ZTable1.Fields[0].AsString;
        bPemilih[vRow].NIK:=ZTable1.Fields[1].AsString;
        bPemilih[vRow].NKK:=ZTable1.Fields[2].AsString;
        bPemilih[vRow].NAMA:=ZTable1.Fields[3].AsString;
        bPemilih[vRow].TEMPAT:=ZTable1.Fields[4].AsString;
        bPemilih[vRow].TANGGAL:=ZTable1.Fields[5].AsString;
        bPemilih[vRow].IBU:=ZTable1.Fields[6].AsString;
        bPemilih[vRow].AGAMA:=ZTable1.Fields[7].AsString;
        bPemilih[vRow].KAWIN:=ZTable1.Fields[8].AsString;
        bPemilih[vRow].KELAMIN:=ZTable1.Fields[9].AsString;
        bPemilih[vRow].KELAINAN:=ZTable1.Fields[10].AsString;
        bPemilih[vRow].ALAMAT:=ZTable1.Fields[11].AsString;
        bPemilih[vRow].KOTA:=kKota;
        bPemilih[vRow].KEC:=kKec;
        bPemilih[vRow].DESA:=kDesa;
        bPemilih[vRow].RW:=ZTable1.Fields[12].AsString;
        bPemilih[vRow].RT:=ZTable1.Fields[13].AsString;
        bPemilih[vRow].KET:=ZTable1.Fields[14].AsString;
        ZTable1.Next;
        vRow:=vRow+1;
      end;
    if (fData=True) then TampilHalaman();
end;

procedure Ttambahtps.TampilHalaman(Hal:Integer = 1);
var
  iter,i:Integer;
begin
  txtHal.Enabled:=True;
  bHal:=100;  //pemilih per halaman
  jHal:=(dRow-1) div bHal;
  if (((dRow-1) mod bHal)>0) then jHal:=jHal+1;
  lblHal.Caption := IntToStr(Hal)+' of '+IntToStr(jHal);
  cHal:=Hal;
  iter:=((Hal-1)*bHal)+1;
  cRow:=1;
  if (cHal=1) then
    btnPrev.Enabled:=False
  else
    btnPrev.Enabled:=True;
  if (cHal=jHal) then
    btnNext.Enabled:=False
  else
    btnNext.Enabled:=True;
  while ((iter<dRow) and (cRow<=bHal)) do
   begin
    StringGrid1.RowCount:=cRow+1;
    StringGrid1.Cells[0,cRow]:=IntToStr(iter);
    StringGrid1.Cells[1,cRow]:=bPemilih[iter].NIK;
    StringGrid1.Cells[2,cRow]:=bPemilih[iter].NKK;
    StringGrid1.Cells[3,cRow]:=bPemilih[iter].NAMA;
    StringGrid1.Cells[4,cRow]:=bPemilih[iter].TEMPAT;
    StringGrid1.Cells[5,cRow]:=bPemilih[iter].TANGGAL;
    StringGrid1.Cells[6,cRow]:=bPemilih[iter].IBU;
    StringGrid1.Cells[7,cRow]:=bPemilih[iter].AGAMA;
    StringGrid1.Cells[8,cRow]:=bPemilih[iter].KAWIN;
    StringGrid1.Cells[9,cRow]:=bPemilih[iter].KELAMIN;
    StringGrid1.Cells[10,cRow]:=bPemilih[iter].KELAINAN;
    StringGrid1.Cells[11,cRow]:=bPemilih[iter].ALAMAT;
    StringGrid1.Cells[12,cRow]:=bPemilih[iter].KOTA;
    StringGrid1.Cells[13,cRow]:=bPemilih[iter].KEC;
    StringGrid1.Cells[14,cRow]:=bPemilih[iter].DESA;
    StringGrid1.Cells[15,cRow]:=bPemilih[iter].RW;
    StringGrid1.Cells[16,cRow]:=bPemilih[iter].RT;
    StringGrid1.Cells[17,cRow]:=bPemilih[iter].KET;
    Inc(crow);
    Inc(iter);
   end;
   for i := 0 to StringGrid1.ColCount - 1 do
    AutoSizeCol(StringGrid1, i);
end;

procedure Ttambahtps.TampilHalaman2(Hal2:Integer = 1);
var
  iter,i:Integer;
begin
  txtHal2.Enabled:=True;
  bHal2:=100;  //pemilih per halaman
  jHal2:=(dRow2-1) div bHal2;
  if (((dRow2-1) mod bHal2)>0) then jHal2:=jHal2+1;
  lblHal2.Caption := IntToStr(Hal2)+' of '+IntToStr(jHal2);
  cHal2:=Hal2;
  iter:=((Hal2-1)*bHal2)+1;
  cRow2:=1;
  if (cHal2=1) then
    btnPrev2.Enabled:=False
  else
    btnPrev2.Enabled:=True;
  if (cHal2=jHal2) then
    btnNext2.Enabled:=False
  else
    btnNext2.Enabled:=True;
  while ((iter<dRow2) and (cRow2<=bHal2)) do
   begin
    StringGrid2.RowCount:=cRow2+1;
    StringGrid2.Cells[0,cRow2]:=IntToStr(iter);
    StringGrid2.Cells[1,cRow2]:=bTPS[iter].NIK;
    StringGrid2.Cells[2,cRow2]:=bTPS[iter].NKK;
    StringGrid2.Cells[3,cRow2]:=bTPS[iter].NAMA;
    StringGrid2.Cells[4,cRow2]:=bTPS[iter].TEMPAT;
    StringGrid2.Cells[5,cRow2]:=bTPS[iter].TANGGAL;
    StringGrid2.Cells[6,cRow2]:=bTPS[iter].IBU;
    StringGrid2.Cells[7,cRow2]:=bTPS[iter].AGAMA;
    StringGrid2.Cells[8,cRow2]:=bTPS[iter].KAWIN;
    StringGrid2.Cells[9,cRow2]:=bTPS[iter].KELAMIN;
    StringGrid2.Cells[10,cRow2]:=bTPS[iter].KELAINAN;
    StringGrid2.Cells[11,cRow2]:=bTPS[iter].ALAMAT;
    StringGrid2.Cells[12,cRow2]:=bTPS[iter].KOTA;
    StringGrid2.Cells[13,cRow2]:=bTPS[iter].KEC;
    StringGrid2.Cells[14,cRow2]:=bTPS[iter].DESA;
    StringGrid2.Cells[15,cRow2]:=bTPS[iter].RW;
    StringGrid2.Cells[16,cRow2]:=bTPS[iter].RT;
    StringGrid2.Cells[17,cRow2]:=bTPS[iter].KET;
    Inc(crow2);
    Inc(iter);
   end;
   for i := 0 to StringGrid2.ColCount - 1 do
    AutoSizeCol(StringGrid2, i);
end;

end.

